Izpētiet Vite spraudņu arhitektūru un iemācieties veidot pielāgotus spraudņus, lai uzlabotu savu izstrādes darbplūsmu. Apgūstiet būtiskākos konceptus ar praktiskiem piemēriem globālai auditorijai.
Vite spraudņu arhitektūras atklāšana: Globāls ceļvedis pielāgotu spraudņu izveidei
Vite, zibenīgi ātrais būvēšanas rīks, ir revolucionizējis frontend izstrādi. Tā ātrums un vienkāršība lielā mērā ir saistīta ar tā jaudīgo spraudņu arhitektūru. Šī arhitektūra ļauj izstrādātājiem paplašināt Vite funkcionalitāti un pielāgot to savām specifiskajām projekta vajadzībām. Šis ceļvedis sniedz visaptverošu Vite spraudņu sistēmas izpēti, dodot jums iespēju izveidot savus pielāgotos spraudņus un optimizēt savu izstrādes darbplūsmu.
Vite pamatprincipu izpratne
Pirms iedziļināties spraudņu izveidē, ir būtiski saprast Vite pamatprincipus:
- Kompilācija pēc pieprasījuma: Vite kompilē kodu tikai tad, kad to pieprasa pārlūkprogramma, ievērojami samazinot startēšanas laiku.
- Noklusējuma ESM: Vite izstrādes procesā izmanto dabiskos ECMAScript moduļus (ESM), novēršot nepieciešamību pēc saiņošanas izstrādes laikā.
- Uz Rollup balstīta produkcijas būve: Produkcijas būvēm Vite izmanto Rollup, augsti optimizētu saiņotāju, lai ģenerētu efektīvu un produkcijai gatavu kodu.
Spraudņu loma Vite ekosistēmā
Vite spraudņu arhitektūra ir izstrādāta, lai būtu ļoti paplašināma. Spraudņi var:
- Pārveidot kodu (piem., transpilēt TypeScript, pievienot priekšprocesorus).
- Pasniegt pielāgotus failus (piem., apstrādāt statiskos resursus, izveidot virtuālus moduļus).
- Modificēt būvēšanas procesu (piem., optimizēt attēlus, ģenerēt servisa darbiniekus).
- Paplašināt Vite CLI (piem., pievienot pielāgotas komandas).
Spraudņi ir atslēga Vite pielāgošanai dažādām projekta prasībām, sākot no vienkāršām modifikācijām līdz sarežģītām integrācijām.
Vite spraudņu arhitektūra: padziļināts apskats
Vite spraudnis būtībā ir JavaScript objekts ar specifiskām īpašībām, kas definē tā uzvedību. Apskatīsim galvenos elementus:
Spraudņu konfigurācija
`vite.config.js` (vai `vite.config.ts`) fails ir vieta, kur jūs konfigurējat savu Vite projektu, ieskaitot norādījumus par to, kurus spraudņus izmantot. Opcija `plugins` pieņem masīvu ar spraudņu objektiem vai funkcijām, kas atgriež spraudņu objektus.
// vite.config.js
import myPlugin from './my-plugin';
export default {
plugins: [
myPlugin(), // Invoke the plugin function to create a plugin instance
],
};
Spraudņa objekta īpašības
Vite spraudņa objektam var būt vairākas īpašības, kas nosaka tā uzvedību dažādās būvēšanas procesa fāzēs. Šeit ir svarīgāko īpašību sadalījums:
- name: Unikāls spraudņa nosaukums. Tas ir obligāts un palīdz atkļūdošanā un konfliktu risināšanā. Piemērs: `'my-custom-plugin'`
- enforce: Nosaka spraudņa izpildes secību. Iespējamās vērtības ir `'pre'` (darbojas pirms pamata spraudņiem), `'normal'` (noklusējuma) un `'post'` (darbojas pēc pamata spraudņiem). Piemērs: `'pre'`
- config: Ļauj modificēt Vite konfigurācijas objektu. Tas saņem lietotāja konfigurāciju un vidi (režīmu un komandu). Piemērs: `config: (config, { mode, command }) => { ... }`
- configResolved: Tiek izsaukts pēc tam, kad Vite konfigurācija ir pilnībā atrisināta. Noderīgi, lai piekļūtu galīgajam konfigurācijas objektam. Piemērs: `configResolved(config) { ... }`
- configureServer: Nodrošina piekļuvi izstrādes servera instancei (līdzīgi Connect/Express). Noderīgi, lai pievienotu pielāgotu starpprogrammatūru vai modificētu servera uzvedību. Piemērs: `configureServer(server) { ... }`
- transformIndexHtml: Ļauj pārveidot `index.html` failu. Noderīgi, lai ievietotu skriptus, stilus vai meta tagus. Piemērs: `transformIndexHtml(html) { ... }`
- resolveId: Ļauj pārtvert un modificēt moduļu atrisināšanu. Noderīgi pielāgotai moduļu atrisināšanas loģikai. Piemērs: `resolveId(source, importer) { ... }`
- load: Ļauj ielādēt pielāgotus moduļus vai modificēt esošo moduļu saturu. Noderīgi virtuāliem moduļiem vai pielāgotiem ielādētājiem. Piemērs: `load(id) { ... }`
- transform: Pārveido moduļu pirmkodu. Līdzīgi kā Babel spraudnis vai PostCSS spraudnis. Piemērs: `transform(code, id) { ... }`
- buildStart: Tiek izsaukts būvēšanas procesa sākumā. Piemērs: `buildStart() { ... }`
- buildEnd: Tiek izsaukts pēc būvēšanas procesa pabeigšanas. Piemērs: `buildEnd() { ... }`
- closeBundle: Tiek izsaukts pēc saiņa ierakstīšanas diskā. Piemērs: `closeBundle() { ... }`
- writeBundle: Tiek izsaukts pirms saiņa ierakstīšanas diskā, ļaujot to modificēt. Piemērs: `writeBundle(options, bundle) { ... }`
- renderError: Ļauj renderēt pielāgotas kļūdu lapas izstrādes laikā. Piemērs: `renderError(error, req, res) { ... }`
- handleHotUpdate: Ļauj smalki kontrolēt HMR. Piemērs: `handleHotUpdate({ file, server }) { ... }`
Spraudņu āķi (Hooks) un izpildes secība
Vite spraudņi darbojas, izmantojot virkni āķu, kas tiek aktivizēti dažādos būvēšanas procesa posmos. Izpratne par secību, kādā šie āķi tiek izpildīti, ir būtiska efektīvu spraudņu rakstīšanai.
- config: Modificēt Vite konfigurāciju.
- configResolved: Piekļūt atrisinātajai konfigurācijai.
- configureServer: Modificēt izstrādes serveri (tikai izstrādes laikā).
- transformIndexHtml: Pārveidot `index.html` failu.
- buildStart: Būvēšanas procesa sākums.
- resolveId: Atrisināt moduļu ID.
- load: Ielādēt moduļa saturu.
- transform: Pārveidot moduļa kodu.
- handleHotUpdate: Apstrādāt karsto moduļu nomaiņu (HMR).
- writeBundle: Modificēt izvades saini pirms ierakstīšanas diskā.
- closeBundle: Tiek izsaukts pēc tam, kad izvades sainis ir ierakstīts diskā.
- buildEnd: Būvēšanas procesa beigas.
Jūsu pirmā pielāgotā Vite spraudņa izveide
Izveidosim vienkāršu Vite spraudni, kas pievieno baneri katra JavaScript faila augšpusē produkcijas būvē. Šis baneris ietvers projekta nosaukumu un versiju.
Spraudņa implementācija
// banner-plugin.js
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
export default function bannerPlugin() {
return {
name: 'banner-plugin',
apply: 'build',
transform(code, id) {
if (!id.endsWith('.js')) {
return code;
}
const packageJsonPath = resolve(process.cwd(), 'package.json');
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;
return banner + code;
},
};
}
Paskaidrojums:
- name: Definē spraudņa nosaukumu, 'banner-plugin'.
- apply: Norāda, ka šim spraudnim jādarbojas tikai būvēšanas procesa laikā. Iestatot to uz 'build', tas darbojas tikai produkcijas vidē, izvairoties no nevajadzīgas slodzes izstrādes laikā.
- transform(code, id):
- Šī ir spraudņa kodola daļa. Tā pārtver katra moduļa kodu (`code`) un ID (`id`).
- Nosacījuma pārbaude: `if (!id.endsWith('.js'))` nodrošina, ka transformācija tiek piemērota tikai JavaScript failiem. Tas novērš citu failu tipu (piemēram, CSS vai HTML) apstrādi, kas varētu izraisīt kļūdas vai neparedzētu uzvedību.
- Piekļuve Package.json:
- `resolve(process.cwd(), 'package.json')` izveido absolūto ceļu uz `package.json` failu. `process.cwd()` atgriež pašreizējo darba direktoriju, nodrošinot pareizā ceļa izmantošanu neatkarīgi no tā, kur tiek izpildīta komanda.
- `JSON.parse(readFileSync(packageJsonPath, 'utf-8'))` nolasa un parsē `package.json` failu. `readFileSync` nolasa failu sinhroni, un `'utf-8'` norāda kodējumu, lai pareizi apstrādātu Unicode rakstzīmes. Sinhronā lasīšana šeit ir pieņemama, jo tā notiek vienu reizi transformācijas sākumā.
- Banera ģenerēšana:
- ``const banner = `/**\n * Project: ${packageJson.name}\n * Version: ${packageJson.version}\n */\n`;`` izveido banera virkni. Tā izmanto veidnes literāļus (atpakaļvērstās pēdiņas), lai viegli iegultu projekta nosaukumu un versiju no `package.json` faila. `\n` secības ievieto jaunas rindas, lai pareizi formatētu baneri. `*` tiek apiets ar `\*`.
- Koda transformācija: `return banner + code;` pievieno baneri oriģinālā JavaScript koda priekšā. Šis ir galīgais rezultāts, ko atgriež transformācijas funkcija.
Spraudņa integrēšana
Importējiet spraudni savā `vite.config.js` failā un pievienojiet to `plugins` masīvam:
// vite.config.js
import bannerPlugin from './banner-plugin';
export default {
plugins: [
bannerPlugin(),
],
};
Būves palaišana
Tagad palaidiet `npm run build` (vai jūsu projekta būvēšanas komandu). Pēc būvēšanas pabeigšanas pārbaudiet ģenerētos JavaScript failus `dist` direktorijā. Jūs redzēsiet baneri katra faila augšpusē.
Papildu spraudņu tehnikas
Papildus vienkāršām koda transformācijām, Vite spraudņi var izmantot sarežģītākas tehnikas, lai uzlabotu to iespējas.
Virtuālie moduļi
Virtuālie moduļi ļauj spraudņiem izveidot moduļus, kas neeksistē kā reāli faili diskā. Tas ir noderīgi, lai ģenerētu dinamisku saturu vai nodrošinātu konfigurācijas datus lietojumprogrammai.
// virtual-module-plugin.js
export default function virtualModulePlugin(options) {
const virtualModuleId = 'virtual:my-module';
const resolvedVirtualModuleId = '\0' + virtualModuleId; // Prefix with \0 to prevent Rollup from processing
return {
name: 'virtual-module-plugin',
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${JSON.stringify(options)};`;
}
},
};
}
Šajā piemērā:
- `virtualModuleId` ir virkne, kas pārstāv virtuālā moduļa identifikatoru.
- `resolvedVirtualModuleId` ir prefikss ar `\0`, lai novērstu, ka Rollup to apstrādā kā reālu failu. Šī ir konvencija, ko izmanto Rollup spraudņos.
- `resolveId` pārtver moduļa atrisināšanu un atgriež atrisināto virtuālā moduļa ID, ja pieprasītais ID atbilst `virtualModuleId`.
- `load` pārtver moduļa ielādi un atgriež moduļa kodu, ja pieprasītais ID atbilst `resolvedVirtualModuleId`. Šajā gadījumā tas ģenerē JavaScript moduli, kas eksportē `options` kā noklusējuma eksportu.
Virtuālā moduļa izmantošana
// vite.config.js
import virtualModulePlugin from './virtual-module-plugin';
export default {
plugins: [
virtualModulePlugin({ message: 'Hello from virtual module!' }),
],
};
// main.js
import message from 'virtual:my-module';
console.log(message.message); // Output: Hello from virtual module!
Index HTML transformēšana
`transformIndexHtml` āķis ļauj modificēt `index.html` failu, piemēram, ievietojot skriptus, stilus vai meta tagus. Tas ir noderīgi, pievienojot analītikas izsekošanu, konfigurējot sociālo mediju metadatus vai pielāgojot HTML struktūru.
// inject-script-plugin.js
export default function injectScriptPlugin() {
return {
name: 'inject-script-plugin',
transformIndexHtml(html) {
return html.replace(
'